#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
#include <unistd.h>
#include <string>

typedef void *(*AlgoConvertFunction)();

void convert(){
    const char *simlib_path_cstr = getenv("CGRA_SIM_LIB");
    if (!simlib_path_cstr) {
      fprintf(stderr, "Environment CGRA_SIM_LIB not set.\n");
      return;
    }
    auto simlib_path = std::string(simlib_path_cstr);
    std::string convertor_lib_path = simlib_path.append("/lib/librpuconvert.so.1");

    // const char* subfix = "/lib/librpuconvert.so";
    // char* convertor_lib_path = (char*) malloc(strlen(simlib_path_cstr) + strlen(subfix));
    // strcpy(convertor_lib_path, simlib_path_cstr);
    // strcat(convertor_lib_path, subfix);

    //librpuconvert.so调用过程
    if (1)
    {
        //   printf("rpu convert exec!\n");
        // TODO: LOAD FROM ENV VARIABLE
        void *hDll = dlopen(convertor_lib_path.c_str(), RTLD_LAZY);

        if (!hDll)
        {
            fprintf(stderr, "Could not load the library:%s\r\n", dlerror());
            // free(convertor_lib_path);
            return;
        }
        // 1 get_sim_instance
        AlgoConvertFunction algo_convert = (AlgoConvertFunction)dlsym(hDll, "algo_convert");
        if (!algo_convert)
        {
            fprintf(stderr, "Could not locate the function:%s\n", dlerror());
            dlclose(hDll);
            // free(convertor_lib_path);
            return;
        }

        algo_convert();

        dlclose(hDll);
        //   printf("rpu convert over!\n");
    }
    // free(convertor_lib_path);
  return;
}